package com.android.xk.mask.client

import com.android.xk.mask.model.*
import com.android.xk.mask.readString
import com.android.xk.mask.toHex
import com.android.xk.mask.toStr
import com.apkfuns.logutils.LogUtils
import io.netty.buffer.ByteBuf
import io.netty.buffer.ByteBufUtil
import io.netty.channel.ChannelHandlerContext
import io.netty.handler.codec.DelimiterBasedFrameDecoder
import io.netty.handler.codec.MessageToMessageDecoder
import java.nio.charset.Charset

class MessageDecoder : MessageToMessageDecoder<ByteBuf>()
{

    override fun decode(ctx: ChannelHandlerContext, msg: ByteBuf, out: MutableList<Any>)
    {
        val len = msg.readableBytes()
        LogUtils.i("接收数据长度 $len")
        if (msg.readByte() == 0x7e.toByte() && msg.readByte() == 0x0f.toByte())
        {
            msg.resetReaderIndex()
            out.add(msg.readBytes(len).array())
        }
        else
        {
            msg.resetReaderIndex()
            val message = Message()
            message.msgLen = msg.readInt()
            message.msgId = msg.readInt()
            message.sequence = msg.readInt()
            message.version = msg.readString(16)
            message.deviceId =
                    msg.readCharSequence(16, Charset.defaultCharset()).toString()

            when (message.msgId)
            {
                0x0F000001 ->
                {
                    val ad = Ad()
                    ad.operateType = msg.readByte()
                    ad.displayArea = msg.readByte()
                    ad.displayIndex = msg.readByte()
                    ad.effectType = msg.readByte()
                    ad.beginTime = msg.readString(16)
                    ad.endTime = msg.readString(16)
                    ad.displayDuration = msg.readInt()
                    ad.resourceId = msg.readInt()
                    ad.resourceUrl = "http://" + msg.readString(32)
                    message.userData = ad
                    out.add(message)
                }
                0x0F000007 ->
                {
                    val appUpdate = AppUpdate()
                    appUpdate.operateType = msg.readByte().toInt()
                    appUpdate.appUrl = "http://" + msg.readString(32)
                    message.userData = appUpdate
                    out.add(message)
                }
                0x0F000009 ->
                {
                    message.userData = Switchgear().apply {
                        operateType = msg.readByte().toInt()
                        actionTime = msg.readString(16)
                    }
                    out.add(message)
                }
                0x0F000011 ->
                {
                    message.userData = Sysparams().apply {
                        paramType = msg.readInt()
                        paramLen = msg.readInt()
                        paramVal = msg.readBytes(paramLen).array()
                    }
                    out.add(message)
                }
            }
        }


//        when (len) {
//            120 -> {
//                val message = Message()
//                message.msgLen = msg.readInt()
//                message.msgId = msg.readInt()
//                message.sequence = msg.readInt()
//                message.version = msg.readString(16)
//                message.deviceId = msg.readCharSequence(16, Charset.defaultCharset()).toString()
//                val ad = Ad()
//                ad.operateType = msg.readByte()
//                ad.displayArea = msg.readByte()
//                ad.displayIndex = msg.readByte()
//                ad.effectType = msg.readByte()
//                ad.beginTime = msg.readString(16)
//                ad.endTime = msg.readString(16)
//                ad.displayDuration = msg.readInt()
//                ad.resourceId = msg.readInt()
//                ad.resourceUrl = "http://" + msg.readString(32)
//                message.userData = ad
//                out.add(message)
//            }
//            77 -> {
//                val message = Message()
//                message.msgLen = msg.readInt()
//                message.msgId = msg.readInt()
//                message.sequence = msg.readInt()
//                message.version = msg.readString(16)
//                message.deviceId = msg.readCharSequence(16, Charset.defaultCharset()).toString()
//                val appUpdate = AppUpdate()
//                appUpdate.operateType = msg.readByte().toInt()
//                appUpdate.appUrl = "http://" + msg.readString(32)
//                message.userData = appUpdate
//                out.add(message)
//            }
//            61 -> {
//                val message = Message()
//                message.msgLen = msg.readInt()
//                message.msgId = msg.readInt()
//                message.sequence = msg.readInt()
//                message.version = msg.readString(16)
//                message.deviceId = msg.readCharSequence(16, Charset.defaultCharset()).toString()
//                message.userData = Switchgear().apply {
//                    operateType = msg.readByte().toInt()
//                    actionTime = msg.readString(16)
//                }
//                out.add(message)
//            }
//            else -> {
//                try {
//
//                    if (msg.readByte() == 0x7e.toByte() && msg.readByte() == 0x0f.toByte()) {
//                        out.add(ByteBufUtil.getBytes(msg, 0, len))
//                    } else {
//                        msg.resetReaderIndex()
//                        val message = Message()
//                        message.msgLen = msg.readInt()
//                        message.msgId = msg.readInt()
//                        message.sequence = msg.readInt()
//                        message.version = msg.readString(16)
//                        message.deviceId =
//                            msg.readCharSequence(16, Charset.defaultCharset()).toString()
//                        if (message.msgId == 0x0F000011) {
//                            message.userData = Sysparams().apply {
//                                paramType = msg.readInt()
//                                paramLen = msg.readInt()
//                                paramVal = msg.readBytes(paramLen).array()
//                            }
//                        }
//                        out.add(message)
//                    }
//
//                } catch (e: Exception) {
//                    e.printStackTrace()
//                }
//            }
//
////            /**
////             * 透传接收
////             */
////            25 -> {
////                out.add(msg.array())
////            }
////            /**
////             * 出货
////             */
////            26 -> {
////                out.add(msg.array())
////            }
////            /**
////             * 心跳
////             */
////            15 -> {
////                val result = ByteArray(15)
////                msg.readBytes(result)
////                out.add(result)
////            }
//        }


//        when (message.msgId) {
//            1 -> {
//                val ad = Ad()
//                ad.deviceId = msg.readCharSequence(16, Charset.defaultCharset()).toString()
//                ad.operateType = msg.readByte()
//                ad.displayArea = msg.readByte()
//                ad.displayIndex = msg.readByte()
//                ad.effectType = msg.readByte()
//                ad.beginTime = msg.readCharSequence(16, Charset.defaultCharset()).toString()
//                ad.endTime = msg.readCharSequence(16, Charset.defaultCharset()).toString()
//                ad.displayDuration = msg.readInt()
//                ad.resourceId = msg.readInt()
//                ad.resourceUrl = msg.readCharSequence(32, Charset.defaultCharset()).toString()
//                message.userData = ad
//                out.add(message)
//            }
//            else -> {
//
//            }
//        }
    }
}